/**
 * 不断尝试查找单个元素，每次查找之间有指定的间隔时间，直到找到为止
 * 结合异步操作await可用于监听元素加载完成之后继续执行
 * @param {string} selector - CSS 选择器，用于选择元素
 * @param config{Object} 配置对象
 * @param config.doc {Document|Element|ShadowRoot}- 查找的文档对象，默认为document
 * @param config.interval  {number} - 每次查找之间的间隔时间（毫秒）默认1秒，即1000毫秒
 * @returns {Promise<Element>} - 返回找到的元素
 */
function findElementUntilFound(selector, config = {}) {
    const defConfig = {doc: document, interval: 1000}
    config = {...defConfig, ...config}
    return new Promise((resolve) => {
        const i1 = setInterval(() => {
            const element = config.doc.querySelector(selector);
            if (element) {
                resolve(element);
                clearInterval(i1);
            }
        }, config.interval);
    });
}

/**
 * 不断尝试查找多个元素，每次查找之间有指定的间隔时间，直到找到为止
 * @param {string} selector - CSS 选择器，用于选择元素
 * @param config{Object} 配置对象
 * @param config.doc {Document|Element|ShadowRoot}- 查找的文档对象，默认为document
 * @param config.interval  {number} - 每次查找之间的间隔时间（毫秒）默认1秒，即1000毫秒
 * @returns {Promise<NodeListOf<Element>>} - 返回找到的 Element列表
 */
function findElementsUntilFound(selector, config = {}) {
    const defConfig = {doc: document, interval: 1000}
    config = {...defConfig, ...config}
    return new Promise((resolve) => {
        function attemptToFind() {
            const elements = config.doc.querySelectorAll(selector);
            if (elements.length > 0) {
                resolve(elements);
            } else {
                setTimeout(attemptToFind, config.interval);
            }
        }

        attemptToFind();
    });
}
